/*
 * Copyright (c) 2006-2025, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-05-05     RT-Thread    first version
 */

/*
 * 项目名称:        四翼无人机(clg)
 * 当前版本:        v1.0
 *
 * 版本修改内容：    v1.0
 *                      1. 添加基础外设驱动(LED,PWM,SERIAL,IIC.....)
 *                      2. 添加飞控相关外设(JY61P,BMP280......)
 *                      3. 移植遥控器接收程序
 *                      4. 移植逻辑PID程序
 *
 * 作者:            @haozi-haozi && @bai-zhi-wants-to-die && @guo-guangyu111
 * 博客:            https://blog.haozi-haozi.cn/
 * Github:          https://github.com/Hunhaozi?tab=repositories
 * Gitee(仓库地址):  https://gitee.com/haozi-haozi/clg
 * 注意事项:         阅读本路径下的README.md文件
 */

// RT-Thread 头文件
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <rtdevice.h>
#include <board.h>

// HAL库头文件
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
// #include "stm32f1xx_hal_conf.h"

// 相关外设头文件
#include "../hardware/LED/led.h"                        // LED         --rt_thread库
#include "../hardware/KEY/key.h"                        // KEY         --rt_thread库
#include "../hardware/PWM/fly_pwm.h"                    // PWM         --HAL库
#include "../hardware/USART_ALL/usart_all.h"            // Serial      --rt_thread库
#include "../hardware/IIC_BMP280/iic_bmp280.h"          // BMP280      --HAL库
#include "../hardware/MS53L/ms53l.h"                    // MS53L       --rt_thread库/HAL库  10hz--0.1m/s  长距离2m
#include "../hardware/JY61P/JY61P.h"                    // JY61P       --rt_thread库
#include "../hardware/MP3m/mp3m.h"                      // MP3         --rt_thread库
#include "../hardware/RGB/rgb_pwm.h"                    // RGB         --HAL库
#include "../hardware/Flight_control/fly_control.h"     // 飞控
#include "../applications/De_bug_mouse/de_bug_mouse.h"  // 相关辅助函数

// 线程相关头文件
#include "rt_thread_demo.h"

//检测外设掩码
#define CHEAK_STA 0b00110100

//个别配置看rt_thread_demo.h文件

int main(void)
{
/****************************** HAL库初始化 BEGIN ******************************/
    HAL_Init();
/****************************** HAL库初始化 END   ******************************/

/****************************** 打印时钟信息 BEGIN *****************************/
    LOG_D("System Clock information");
    LOG_D("SYSCLK_Frequency = %d", HAL_RCC_GetSysClockFreq());
    LOG_D("HCLK_Frequency   = %d", HAL_RCC_GetHCLKFreq());
    LOG_D("PCLK1_Frequency  = %d", HAL_RCC_GetPCLK1Freq());
    LOG_D("PCLK2_Frequency  = %d", HAL_RCC_GetPCLK2Freq());
/****************************** 打印时钟信息 END   *****************************/
/****************************** rt_thread初始化 BEGIN **************************/


/****************************** rt_thread初始化 END   **************************/

/****************************** 外设初始化 BEGIN1 ********************************/
#if RT_THREAD_FLY_DEBUG == 1
    LED_Init();     // LED初始化
    Key_Init();     // KEY初始化（已启用中断，中断中读写了event或sem, 所以相关事件集初始化需要提前）
#endif
    fly_pwm_init();         // PWM初始化      --TIM8的四路PWM输出  --电调
    // RGB_PWM_Init();         // PWM初始化      --TIM4的三路PWM输出  --RGB
    // IIC_BMP280_Init();      // BMP280初始化  --硬件IIC1初始化      --气压计
/****************************** 外设初始化 END1   ********************************/
/****************************** 外设初始化 BEGIN2 ********************************/
    // usart2_init(115200);    // 串口2初始化    --openmv || k230
    // Ms53l_init();           // 串口3初始化    --激光测距 /IIC2(软件)
    usart4_init(115200);    // 串口4初始化    --遥控器 && 调试
    JY61P_Init();           // 串口5初始化    --陀螺仪
    // MP3_Init();             // 串口3（√）       --MP3初始化
/****************************** 外设初始化 END2   ********************************/
//    if( fly_control_init(CHEAK_STA) == RT_ERROR )
//    {
//        while(1);
//    }

#if RT_THREAD_SERIAL_DEBUG == 1
    Serial_printf(SERIAL1,"All enabled fly control devices initialized successfully.\n");
#endif
/****************************** 调试 BEGIN ************************************/

/****************************** 调试 END   ************************************/
    // Fly_unlock();
    fly_unlock_flag = 0; // 默认不解锁

    sem_init();         // 信号量
    thread_t_init();    // 线程
    event_init();       // 事件集

    return RT_EOK;
}
